import { addRole, delRole, getResourceByRole, getRoles, addOrEdit } from '@/api/system/role'
import { getResourceToRole } from '@/api/system/menu'
import { commonUtils } from '@/utils/commonUtils'

export default {
  name: 'Role',
  data() {
    return {
      // 遮罩层
      loading: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 角色表格数据
      roleList: [],
      // 查询参数
      queryParams: {
        pageNum: 1,
        pageSize: 10,
        name: undefined
      },
      multipleSelection: [],
      delList: [],
      deleteIds: [],
      addVisible: false,
      editVisible: false,
      role: {
        resourceIds: []
      },
      idx: -1,
      id: -1,
      //tree配置
      defaultProps: {
        children: 'children',
        label: 'label'
      },
      resource: [],
      // 表单校验
      rules: {
        name: [
          { required: true, message: '角色名称不能为空', trigger: 'blur' }
        ]
      },
      addTitle:undefined
    }
  },
  created() {
    this.getList()
    this.getResources()
  },
  methods: {
    /** 查询角色列表 */
    getList() {
      this.loading = true
      getRoles(this.queryParams).then(res => {
          this.roleList = res.roles.records
          this.total = res.roles.total
          this.loading = false
        }
      )
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1
      this.getList()
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.resetForm('queryForm')
      this.handleQuery()
    },
    // 删除操作
    handleDelete(index, row) {
      if (!row.id) {
        this.$confirm('请选择需要删除的数据', '提示', {
          type: 'warning'
        })
        return
      }
      this.deleteIds.push(row.id)
      // 二次确认删除
      this.$confirm('删除角色信息会导致某些功能不能使用，请谨慎操作！', '提示', {
        type: 'warning'
      })
        .then(() => {
          if (!this.deleteIds) return
          delRole(this.deleteIds).then(res => {
            if (res.success == true) {
              this.msgSuccess('删除成功！')
            } else {
              this.msgError(res.msg)
            }
            this.getList()
            this.deleteIds = []

          })
        })
        .catch(() => {
        })
    },
    // 多选操作
    handleSelectionChange(val) {
      this.multipleSelection = val
    },
    delAllSelection() {
      if (this.multipleSelection.length <= 0) {
        this.$message.error('请选择需要删除的数据！')
        return
      }
      this.multipleSelection.forEach((item) => {
        this.deleteIds.push(item.id)
      })
      if (this.deleteIds.length <= 0) {
        this.$message.error('请选择需要删除的数据！')
        return
      }
      // 二次确认删除
      this.$confirm('删除角色信息会导致某些功能不能使用，请谨慎操作！', '提示', {
        type: 'warning'
      })
        .then(() => {
          if (!this.deleteIds) return
          delRole(this.deleteIds)
            .then(res => {
              if (res.success == true) {
                this.$message.success('删除成功！')
              } else {
                this.$message.error(res.msg)
              }
              this.getList()
              this.deleteIds = []
              this.multipleSelection = []
            })
        })
        .catch(() => {
        })

    },
    //添加操作
    addRole() {
      this.addTitle = '新增角色'
      this.addVisible = true
      this.role = {
        resourceIds: []
      }
      //先判断是否有选中的节点，有的话先清空
      let currentNode = this.$refs.tree.getCheckedNodes()
      if (currentNode) {
        currentNode.forEach((item) => {
          this.$refs.tree.setChecked(item, false)
        })
      }
    },
    //获取资源数据给tree
    getResources() {
      getResourceToRole()
        .then(res => {
          if (res.success) {
            let data = this.formatData(res.res)
            this.resource = commonUtils.processItems(data)
          }
        })
    },
    //格式化数组，满足tree的对应关系
    formatData(data) {
      var newData = []
      data.forEach((item) => {
        var it = {}
        it.id = item.id
        it.label = item.name
        it.menuType = item.menuType
        it.parentId = item.parentId
        newData.push(it)
      })
      return newData
    },
    //添加角色时，选中tree时的情况
    getChooseData() {
      let elTree = this.$refs.tree
      let nodes = elTree.getCheckedNodes(false, true)
      let arr = []
      nodes.forEach((item) => {
        arr.push(item.id)
      })
      this.role.resourceIds = arr
    },
    //确定添加角色后保存新增
    saveAdd() {
      if (!this.role.name) {
        this.$confirm('用户名不能为空！', '警告', {
          type: 'error' }).then(() => {}).catch(() => {})
        return
      }
      if (this.role.resourceIds.length <= 0) {
        this.$confirm('角色必须分配权限！', '警告', {
          type: 'warning'
        }).then(() => {}).catch(() => {})
        return
      }
      addRole(this.role).then(res => {
        if (res.success == true) {
          this.msgSuccess('操作成功！')
        } else {
          this.msgError('操作失败！')
        }
        this.getList()
      })
      this.addVisible = false
    },
    // 编辑操作,要获取所有资源信息，以及当前角色拥有的资源信息
    handleEdit(index, row) {
      this.idx = index
      this.addTitle = "修改角色"
      this.addVisible = true
      this.role = row
      this.getResourceByRoleId(row.id)
    },
    //编辑角色时，获取当前角色对应的权限信息
    getResourceByRoleId(value) {
      getResourceByRole(value).then(res => {
        if (res.success == true) {
          this.role.resourceIds = res.list
          //先判断是否有选中的节点，有的话先清空
          let currentNode = this.$refs.tree.getCheckedNodes()
          if (currentNode) {
            currentNode.forEach((item) => {
              this.$refs.tree.setChecked(item, false)
            })
          }
          res.list.map((i, n) => {
            //根据i获取tree中的节点
            var node = this.$refs.tree.getNode(i)
            if (node.isLeaf) {
              //设置某个节点的勾选状态
              this.$refs.tree.setChecked(node, true)

            }
          })
        }
      })
    },
  }
}
